/**
 * 统一数据同步Hook
 * 职责：初始化必要数据 + 监听布局类偏好在多标签页间同步
 */

import {useEffect, useRef} from 'react';
import {usePreferencesStore} from '@/stores/preferences';
import {STORAGE_KEYS} from '@/lib/storageKeys';
import {chromeStorage} from '@/lib/chromeStorage';

const SYNC_CONFIG = {
    VISIBILITY_CHANGE_EVENT: 'visibilitychange',
    CHROME_STORAGE_AREA: 'local'
} as const;

/**
 * 统一数据同步Hook
 * 确保数据初始化完成 + 监听存储变化实时同步
 * @returns void
 */
export function useDataSync(): void {
    const hasMountedRef = useRef(false);

    useEffect(() => {
        if (hasMountedRef.current) return;

        if (typeof chrome === 'undefined' || !chrome.storage?.onChanged) {
            console.warn('Chrome Storage API不可用，跳过数据同步');
            return;
        }

        hasMountedRef.current = true;

        let hasHiddenChanges = false;

        const storageChangeListener = (
            changes: { [key: string]: chrome.storage.StorageChange },
            areaName: string
        ) => {
            // 只处理本地存储变化
            if (areaName !== SYNC_CONFIG.CHROME_STORAGE_AREA) return;

            // 检查是否为当前页面操作触发的变化（使用全局存储拦截器判断）
            for (const key of Object.keys(changes)) {
                const changeData = changes[key]?.newValue;
                if (changeData && chromeStorage.isOwnOperation(changeData)) {
                    return; // 忽略自身操作引起的Storage变化
                }
            }

            let hasRelevantChanges = false;

            for (const key of Object.keys(changes)) {
                // 仅同步 UI 偏好
                if (key === STORAGE_KEYS.USER_PREFERENCES) {
                    hasRelevantChanges = true;
                    break;
                }
            }

            if (!hasRelevantChanges) return;

            if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {
                hasHiddenChanges = true;
                return;
            }

            // 同步偏好设置变化（仅保留此项）
            syncPreferencesChanges(changes);

            // 🚫 已禁用以下同步功能：
            // - syncSpacesChanges(changes);
            // - debouncedRefresh() for collections
        };

        const visibilityChangeHandler = async () => {
            if (hasHiddenChanges &&
                typeof document !== 'undefined' &&
                document.visibilityState === 'visible') {
                hasHiddenChanges = false;

                try {
                    await usePreferencesStore.getState().loadPreferences();
                } catch (error) {
                    console.warn('页面可见性恢复时数据同步失败:', error);
                }
            }
        };

        chrome.storage.onChanged.addListener(storageChangeListener);
        if (typeof document !== 'undefined') {
            document.addEventListener(SYNC_CONFIG.VISIBILITY_CHANGE_EVENT, visibilityChangeHandler);
        }

        // 清理函数
        return () => {
            try {
                chrome.storage.onChanged.removeListener(storageChangeListener);
                if (typeof document !== 'undefined') {
                    document.removeEventListener(SYNC_CONFIG.VISIBILITY_CHANGE_EVENT, visibilityChangeHandler);
                }
            } catch (error) {
                // 静默处理清理错误
            }
        };
    }, []);
}

/**
 * 同步偏好设置变化
 * 直接重新加载偏好设置数据，因为偏好数据量不大且确保数据一致性
 */
function syncPreferencesChanges(changes: { [key: string]: chrome.storage.StorageChange }): void {
    // 检查是否有偏好设置数据变化
    if (Object.prototype.hasOwnProperty.call(changes, STORAGE_KEYS.USER_PREFERENCES)) {
        // 直接重新加载偏好设置数据，避免复杂的逐项对比逻辑
        usePreferencesStore.getState().loadPreferences().catch((error) => {
            console.warn('同步偏好设置失败:', error);
        });
    }
}
